package plugins

import (
	"net/http"
	"runtime"

	"github.com/golang-jwt/jwt/v4"
	"github.com/quarkcloudio/quark-go/v2/pkg/builder"
)

type ErrorHandle struct{}

// 创建一个全局的处理函数包装器
func (p *ErrorHandle) GlobalErrorHandler(next builder.Handle) builder.Handle {
	return func(c *builder.Context) error {
		defer func() {
			if r := recover(); r != nil {
				if errMsg, ok := r.(string); ok {
					c.JSONError(errMsg)
				} else if errMsg, ok := r.(runtime.Error); ok {
					c.JSONError("系统错误:" + errMsg.Error())
				} else {
					// jwt鉴权失败
					if ve, ok := r.(*jwt.ValidationError); ok {
						c.EchoContext.JSON(http.StatusOK, map[string]interface{}{
							"code":    401,
							"message": ve.Error(),
						})
					} else {
						c.JSONError("系统未知错误")
					}
				}
			}
		}()
		return next(c)
	}
}
